library(tidyverse)
library(plotly)
l_df <- read_csv("levels-cleaned.csv")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  timestamp = col_character(),
  company = col_character(),
  level = col_character(),
  title = col_character(),
  location = col_character(),
  tag = col_character(),
  gender = col_character(),
  city = col_character(),
  state = col_character(),
  month = col_character()
)
See spec(...) for full column specifications.
companyCompensation <- 
  l_df %>%
  group_by(year, company) %>%
  summarise(yearly_compensation = mean(totalyearlycompensation))
`summarise()` regrouping output by 'year' (override with `.groups` argument)
cityCompensation <- 
  l_df %>%
  group_by(year, location) %>%
  summarise(yearly_compensation = mean(totalyearlycompensation))
`summarise()` regrouping output by 'year' (override with `.groups` argument)

Yearly mean compensation for top 5 companies in 2017, 2018, 2019, 2020, 2021

companyCompensation2017 <- 
  companyCompensation %>%
  filter(year == 2017) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2018 <- 
  companyCompensation %>%
  filter(year == 2018) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2019 <- 
  companyCompensation %>%
  filter(year == 2019) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2020 <- 
  companyCompensation %>%
  filter(year == 2020) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2021 <- 
  companyCompensation %>%
  filter(year == 2021) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(companyCompensation2017, companyCompensation2018, companyCompensation2019, companyCompensation2020, companyCompensation2021, nrows = 5)

Yearly mean compensation for top 5 cities in 2017, 2018, 2019, 2020, 2021

cityCompensation2017 <- 
  cityCompensation %>%
  filter(year == 2017) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018 <- 
  cityCompensation %>%
  filter(year == 2018) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2019 <- 
  cityCompensation %>%
  filter(year == 2019) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2020 <- 
  cityCompensation %>%
  filter(year == 2020) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021 <- 
  cityCompensation %>%
  filter(year == 2021) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(cityCompensation2017, cityCompensation2018, cityCompensation2019, cityCompensation2020, cityCompensation2021, nrows = 5)

Yearly mean compensation for last 5 companies in 2017, 2018, 2019, 2020, 2021

companyCompensation2017 <- 
  companyCompensation %>%
  filter(year == 2017) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2018 <- 
  companyCompensation %>%
  filter(year == 2018) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2019 <- 
  companyCompensation %>%
  filter(year == 2019) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2020 <- 
  companyCompensation %>%
  filter(year == 2020) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

companyCompensation2021 <- 
  companyCompensation %>%
  filter(year == 2021) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~company,
    type = "bar",
    text = ~paste(company, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(companyCompensation2017, companyCompensation2018, companyCompensation2019, companyCompensation2020, companyCompensation2021, nrows = 5)

Yearly mean compensation for last 5 cities in 2017, 2018, 2019, 2020, 2021

cityCompensation2017 <- 
  cityCompensation %>%
  filter(year == 2017) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018 <- 
  cityCompensation %>%
  filter(year == 2018) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2019 <- 
  cityCompensation %>%
  filter(year == 2019) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2020 <- 
  cityCompensation %>%
  filter(year == 2020) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021 <- 
  cityCompensation %>%
  filter(year == 2021) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(cityCompensation2017, cityCompensation2018, cityCompensation2019, cityCompensation2020, cityCompensation2021, nrows = 5)

Making YOE Levels

YOE_Levels <- 
  l_df %>%
  mutate(YOE = case_when(between(yearsofexperience, 0, 2) ~ "0-2",
                         between(yearsofexperience, 2, 5) ~ "2-5",
                         between(yearsofexperience, 5, 10) ~ "5-10",
                         yearsofexperience >= 10 ~ "10+"))

cityCompensationYOE <-
  YOE_Levels %>%
  group_by(year, YOE, location) %>%
  summarise(yearly_compensation = mean(totalyearlycompensation))
`summarise()` regrouping output by 'year', 'YOE' (override with `.groups` argument)

2018 top 5 locations with experience plots

cityCompensation2018_01 <- 
  cityCompensationYOE %>%
  filter(YOE == "0-2") %>%
  filter(year == 2018) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018_15 <- 
  cityCompensationYOE %>%
  filter(YOE == "2-5") %>%
  filter(year == 2018) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018_510 <- 
  cityCompensationYOE %>%
  filter(YOE == "5-10") %>%
  filter(year == 2018) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018_10_ <- 
  cityCompensationYOE %>%
  filter(YOE == "10+") %>%
  filter(year == 2018) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(cityCompensation2018_01, cityCompensation2018_15, cityCompensation2018_510, cityCompensation2018_10_, nrows = 4)

2021 top 5 locations with experience plots

cityCompensation2021_01 <- 
  cityCompensationYOE %>%
  filter(YOE == "0-2") %>%
  filter(year == 2021) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021_15 <- 
  cityCompensationYOE %>%
  filter(YOE == "2-5") %>%
  filter(year == 2021) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021_510 <- 
  cityCompensationYOE %>%
  filter(YOE == "5-10") %>%
  filter(year == 2021) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021_10_ <- 
  cityCompensationYOE %>%
  filter(YOE == "10+") %>%
  filter(year == 2021) %>%
  arrange(desc(yearly_compensation)) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(cityCompensation2021_01, cityCompensation2021_15, cityCompensation2021_510, cityCompensation2021_10_, nrows = 4)

2018 last 5 locations with experience plots

cityCompensation2018_01 <- 
  cityCompensationYOE %>%
  filter(YOE == "0-2") %>%
  filter(year == 2018) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018_15 <- 
  cityCompensationYOE %>%
  filter(YOE == "2-5") %>%
  filter(year == 2018) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018_510 <- 
  cityCompensationYOE %>%
  filter(YOE == "5-10") %>%
  filter(year == 2018) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2018_10_ <- 
  cityCompensationYOE %>%
  filter(YOE == "10+") %>%
  filter(year == 2018) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(cityCompensation2018_01, cityCompensation2018_15, cityCompensation2018_510, cityCompensation2018_10_, nrows = 4)

2021 last 5 locations with experience plots

cityCompensation2021_01 <- 
  cityCompensationYOE %>%
  filter(YOE == "0-2") %>%
  filter(year == 2021) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021_15 <- 
  cityCompensationYOE %>%
  filter(YOE == "2-5") %>%
  filter(year == 2021) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021_510 <- 
  cityCompensationYOE %>%
  filter(YOE == "5-10") %>%
  filter(year == 2021) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

cityCompensation2021_10_ <- 
  cityCompensationYOE %>%
  filter(YOE == "10+") %>%
  filter(year == 2021) %>%
  arrange(yearly_compensation) %>%
  head(n = 5) %>%
  plot_ly(
    x = ~yearly_compensation,
    y = ~location,
    type = "bar",
    text = ~paste(location, ": $", round(yearly_compensation), sep = ""),
    hoverinfo = "text"
  ) %>%
  layout(showlegend = FALSE)

subplot(cityCompensation2021_01, cityCompensation2021_15, cityCompensation2021_510, cityCompensation2021_10_, nrows = 4)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGxvdGx5KQpgYGAKCmBgYHtyfQpsX2RmIDwtIHJlYWRfY3N2KCJsZXZlbHMtY2xlYW5lZC5jc3YiKQpgYGAKCmBgYHtyfQpjb21wYW55Q29tcGVuc2F0aW9uIDwtIAogIGxfZGYgJT4lCiAgZ3JvdXBfYnkoeWVhciwgY29tcGFueSkgJT4lCiAgc3VtbWFyaXNlKHllYXJseV9jb21wZW5zYXRpb24gPSBtZWFuKHRvdGFseWVhcmx5Y29tcGVuc2F0aW9uKSkKCmNpdHlDb21wZW5zYXRpb24gPC0gCiAgbF9kZiAlPiUKICBncm91cF9ieSh5ZWFyLCBsb2NhdGlvbikgJT4lCiAgc3VtbWFyaXNlKHllYXJseV9jb21wZW5zYXRpb24gPSBtZWFuKHRvdGFseWVhcmx5Y29tcGVuc2F0aW9uKSkKYGBgCgpZZWFybHkgbWVhbiBjb21wZW5zYXRpb24gZm9yIHRvcCA1IGNvbXBhbmllcyBpbiAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxCmBgYHtyfQpjb21wYW55Q29tcGVuc2F0aW9uMjAxNyA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTcpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAxOCA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAxOSA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAyMCA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAyMSA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpzdWJwbG90KGNvbXBhbnlDb21wZW5zYXRpb24yMDE3LCBjb21wYW55Q29tcGVuc2F0aW9uMjAxOCwgY29tcGFueUNvbXBlbnNhdGlvbjIwMTksIGNvbXBhbnlDb21wZW5zYXRpb24yMDIwLCBjb21wYW55Q29tcGVuc2F0aW9uMjAyMSwgbnJvd3MgPSA1KQpgYGAKClllYXJseSBtZWFuIGNvbXBlbnNhdGlvbiBmb3IgdG9wIDUgY2l0aWVzIGluIDIwMTcsIDIwMTgsIDIwMTksIDIwMjAsIDIwMjEKYGBge3J9CmNpdHlDb21wZW5zYXRpb24yMDE3IDwtIAogIGNpdHlDb21wZW5zYXRpb24gJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxNykgJT4lCiAgYXJyYW5nZShkZXNjKHllYXJseV9jb21wZW5zYXRpb24pKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMTggPC0gCiAgY2l0eUNvbXBlbnNhdGlvbiAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBhcnJhbmdlKGRlc2MoeWVhcmx5X2NvbXBlbnNhdGlvbikpICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjaXR5Q29tcGVuc2F0aW9uMjAxOSA8LSAKICBjaXR5Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDIwIDwtIAogIGNpdHlDb21wZW5zYXRpb24gJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAyMCkgJT4lCiAgYXJyYW5nZShkZXNjKHllYXJseV9jb21wZW5zYXRpb24pKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMjEgPC0gCiAgY2l0eUNvbXBlbnNhdGlvbiAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUKICBhcnJhbmdlKGRlc2MoeWVhcmx5X2NvbXBlbnNhdGlvbikpICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpzdWJwbG90KGNpdHlDb21wZW5zYXRpb24yMDE3LCBjaXR5Q29tcGVuc2F0aW9uMjAxOCwgY2l0eUNvbXBlbnNhdGlvbjIwMTksIGNpdHlDb21wZW5zYXRpb24yMDIwLCBjaXR5Q29tcGVuc2F0aW9uMjAyMSwgbnJvd3MgPSA1KQpgYGAKClllYXJseSBtZWFuIGNvbXBlbnNhdGlvbiBmb3IgbGFzdCA1IGNvbXBhbmllcyBpbiAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxCmBgYHtyfQpjb21wYW55Q29tcGVuc2F0aW9uMjAxNyA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTcpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAxOCA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAxOSA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAyMCA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjb21wYW55Q29tcGVuc2F0aW9uMjAyMSA8LSAKICBjb21wYW55Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+Y29tcGFueSwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUoY29tcGFueSwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpzdWJwbG90KGNvbXBhbnlDb21wZW5zYXRpb24yMDE3LCBjb21wYW55Q29tcGVuc2F0aW9uMjAxOCwgY29tcGFueUNvbXBlbnNhdGlvbjIwMTksIGNvbXBhbnlDb21wZW5zYXRpb24yMDIwLCBjb21wYW55Q29tcGVuc2F0aW9uMjAyMSwgbnJvd3MgPSA1KQpgYGAKClllYXJseSBtZWFuIGNvbXBlbnNhdGlvbiBmb3IgbGFzdCA1IGNpdGllcyBpbiAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxCmBgYHtyfQpjaXR5Q29tcGVuc2F0aW9uMjAxNyA8LSAKICBjaXR5Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTcpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDE4IDwtIAogIGNpdHlDb21wZW5zYXRpb24gJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgYXJyYW5nZSh5ZWFybHlfY29tcGVuc2F0aW9uKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMTkgPC0gCiAgY2l0eUNvbXBlbnNhdGlvbiAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUKICBhcnJhbmdlKHllYXJseV9jb21wZW5zYXRpb24pICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjaXR5Q29tcGVuc2F0aW9uMjAyMCA8LSAKICBjaXR5Q29tcGVuc2F0aW9uICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDIxIDwtIAogIGNpdHlDb21wZW5zYXRpb24gJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lCiAgYXJyYW5nZSh5ZWFybHlfY29tcGVuc2F0aW9uKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKc3VicGxvdChjaXR5Q29tcGVuc2F0aW9uMjAxNywgY2l0eUNvbXBlbnNhdGlvbjIwMTgsIGNpdHlDb21wZW5zYXRpb24yMDE5LCBjaXR5Q29tcGVuc2F0aW9uMjAyMCwgY2l0eUNvbXBlbnNhdGlvbjIwMjEsIG5yb3dzID0gNSkKYGBgCgpNYWtpbmcgWU9FIExldmVscwpgYGB7cn0KWU9FX0xldmVscyA8LSAKICBsX2RmICU+JQogIG11dGF0ZShZT0UgPSBjYXNlX3doZW4oYmV0d2Vlbih5ZWFyc29mZXhwZXJpZW5jZSwgMCwgMikgfiAiMC0yIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4oeWVhcnNvZmV4cGVyaWVuY2UsIDIsIDUpIH4gIjItNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuKHllYXJzb2ZleHBlcmllbmNlLCA1LCAxMCkgfiAiNS0xMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyc29mZXhwZXJpZW5jZSA+PSAxMCB+ICIxMCsiKSkKCmNpdHlDb21wZW5zYXRpb25ZT0UgPC0KICBZT0VfTGV2ZWxzICU+JQogIGdyb3VwX2J5KHllYXIsIFlPRSwgbG9jYXRpb24pICU+JQogIHN1bW1hcmlzZSh5ZWFybHlfY29tcGVuc2F0aW9uID0gbWVhbih0b3RhbHllYXJseWNvbXBlbnNhdGlvbikpCmBgYAoKMjAxOCB0b3AgNSBsb2NhdGlvbnMgd2l0aCBleHBlcmllbmNlIHBsb3RzCmBgYHtyfQpjaXR5Q29tcGVuc2F0aW9uMjAxOF8wMSA8LSAKICBjaXR5Q29tcGVuc2F0aW9uWU9FICU+JQogIGZpbHRlcihZT0UgPT0gIjAtMiIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDE4XzE1IDwtIAogIGNpdHlDb21wZW5zYXRpb25ZT0UgJT4lCiAgZmlsdGVyKFlPRSA9PSAiMi01IikgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgYXJyYW5nZShkZXNjKHllYXJseV9jb21wZW5zYXRpb24pKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMThfNTEwIDwtIAogIGNpdHlDb21wZW5zYXRpb25ZT0UgJT4lCiAgZmlsdGVyKFlPRSA9PSAiNS0xMCIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDE4XzEwXyA8LSAKICBjaXR5Q29tcGVuc2F0aW9uWU9FICU+JQogIGZpbHRlcihZT0UgPT0gIjEwKyIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCnN1YnBsb3QoY2l0eUNvbXBlbnNhdGlvbjIwMThfMDEsIGNpdHlDb21wZW5zYXRpb24yMDE4XzE1LCBjaXR5Q29tcGVuc2F0aW9uMjAxOF81MTAsIGNpdHlDb21wZW5zYXRpb24yMDE4XzEwXywgbnJvd3MgPSA0KQpgYGAKCjIwMjEgdG9wIDUgbG9jYXRpb25zIHdpdGggZXhwZXJpZW5jZSBwbG90cwpgYGB7cn0KY2l0eUNvbXBlbnNhdGlvbjIwMjFfMDEgPC0gCiAgY2l0eUNvbXBlbnNhdGlvbllPRSAlPiUKICBmaWx0ZXIoWU9FID09ICIwLTIiKSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUKICBhcnJhbmdlKGRlc2MoeWVhcmx5X2NvbXBlbnNhdGlvbikpICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjaXR5Q29tcGVuc2F0aW9uMjAyMV8xNSA8LSAKICBjaXR5Q29tcGVuc2F0aW9uWU9FICU+JQogIGZpbHRlcihZT0UgPT0gIjItNSIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JQogIGFycmFuZ2UoZGVzYyh5ZWFybHlfY29tcGVuc2F0aW9uKSkgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDIxXzUxMCA8LSAKICBjaXR5Q29tcGVuc2F0aW9uWU9FICU+JQogIGZpbHRlcihZT0UgPT0gIjUtMTAiKSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUKICBhcnJhbmdlKGRlc2MoeWVhcmx5X2NvbXBlbnNhdGlvbikpICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjaXR5Q29tcGVuc2F0aW9uMjAyMV8xMF8gPC0gCiAgY2l0eUNvbXBlbnNhdGlvbllPRSAlPiUKICBmaWx0ZXIoWU9FID09ICIxMCsiKSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUKICBhcnJhbmdlKGRlc2MoeWVhcmx5X2NvbXBlbnNhdGlvbikpICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpzdWJwbG90KGNpdHlDb21wZW5zYXRpb24yMDIxXzAxLCBjaXR5Q29tcGVuc2F0aW9uMjAyMV8xNSwgY2l0eUNvbXBlbnNhdGlvbjIwMjFfNTEwLCBjaXR5Q29tcGVuc2F0aW9uMjAyMV8xMF8sIG5yb3dzID0gNCkKYGBgCgoyMDE4IGxhc3QgNSBsb2NhdGlvbnMgd2l0aCBleHBlcmllbmNlIHBsb3RzCmBgYHtyfQpjaXR5Q29tcGVuc2F0aW9uMjAxOF8wMSA8LSAKICBjaXR5Q29tcGVuc2F0aW9uWU9FICU+JQogIGZpbHRlcihZT0UgPT0gIjAtMiIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDE4XzE1IDwtIAogIGNpdHlDb21wZW5zYXRpb25ZT0UgJT4lCiAgZmlsdGVyKFlPRSA9PSAiMi01IikgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgYXJyYW5nZSh5ZWFybHlfY29tcGVuc2F0aW9uKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMThfNTEwIDwtIAogIGNpdHlDb21wZW5zYXRpb25ZT0UgJT4lCiAgZmlsdGVyKFlPRSA9PSAiNS0xMCIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCmNpdHlDb21wZW5zYXRpb24yMDE4XzEwXyA8LSAKICBjaXR5Q29tcGVuc2F0aW9uWU9FICU+JQogIGZpbHRlcihZT0UgPT0gIjEwKyIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGFycmFuZ2UoeWVhcmx5X2NvbXBlbnNhdGlvbikgJT4lCiAgaGVhZChuID0gNSkgJT4lCiAgcGxvdF9seSgKICAgIHggPSB+eWVhcmx5X2NvbXBlbnNhdGlvbiwKICAgIHkgPSB+bG9jYXRpb24sCiAgICB0eXBlID0gImJhciIsCiAgICB0ZXh0ID0gfnBhc3RlKGxvY2F0aW9uLCAiOiAkIiwgcm91bmQoeWVhcmx5X2NvbXBlbnNhdGlvbiksIHNlcCA9ICIiKSwKICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IgogICkgJT4lCiAgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSkKCnN1YnBsb3QoY2l0eUNvbXBlbnNhdGlvbjIwMThfMDEsIGNpdHlDb21wZW5zYXRpb24yMDE4XzE1LCBjaXR5Q29tcGVuc2F0aW9uMjAxOF81MTAsIGNpdHlDb21wZW5zYXRpb24yMDE4XzEwXywgbnJvd3MgPSA0KQpgYGAKCjIwMjEgbGFzdCA1IGxvY2F0aW9ucyB3aXRoIGV4cGVyaWVuY2UgcGxvdHMKYGBge3J9CmNpdHlDb21wZW5zYXRpb24yMDIxXzAxIDwtIAogIGNpdHlDb21wZW5zYXRpb25ZT0UgJT4lCiAgZmlsdGVyKFlPRSA9PSAiMC0yIikgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lCiAgYXJyYW5nZSh5ZWFybHlfY29tcGVuc2F0aW9uKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMjFfMTUgPC0gCiAgY2l0eUNvbXBlbnNhdGlvbllPRSAlPiUKICBmaWx0ZXIoWU9FID09ICIyLTUiKSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUKICBhcnJhbmdlKHllYXJseV9jb21wZW5zYXRpb24pICU+JQogIGhlYWQobiA9IDUpICU+JQogIHBsb3RfbHkoCiAgICB4ID0gfnllYXJseV9jb21wZW5zYXRpb24sCiAgICB5ID0gfmxvY2F0aW9uLAogICAgdHlwZSA9ICJiYXIiLAogICAgdGV4dCA9IH5wYXN0ZShsb2NhdGlvbiwgIjogJCIsIHJvdW5kKHllYXJseV9jb21wZW5zYXRpb24pLCBzZXAgPSAiIiksCiAgICBob3ZlcmluZm8gPSAidGV4dCIKICApICU+JQogIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UpCgpjaXR5Q29tcGVuc2F0aW9uMjAyMV81MTAgPC0gCiAgY2l0eUNvbXBlbnNhdGlvbllPRSAlPiUKICBmaWx0ZXIoWU9FID09ICI1LTEwIikgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lCiAgYXJyYW5nZSh5ZWFybHlfY29tcGVuc2F0aW9uKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKY2l0eUNvbXBlbnNhdGlvbjIwMjFfMTBfIDwtIAogIGNpdHlDb21wZW5zYXRpb25ZT0UgJT4lCiAgZmlsdGVyKFlPRSA9PSAiMTArIikgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lCiAgYXJyYW5nZSh5ZWFybHlfY29tcGVuc2F0aW9uKSAlPiUKICBoZWFkKG4gPSA1KSAlPiUKICBwbG90X2x5KAogICAgeCA9IH55ZWFybHlfY29tcGVuc2F0aW9uLAogICAgeSA9IH5sb2NhdGlvbiwKICAgIHR5cGUgPSAiYmFyIiwKICAgIHRleHQgPSB+cGFzdGUobG9jYXRpb24sICI6ICQiLCByb3VuZCh5ZWFybHlfY29tcGVuc2F0aW9uKSwgc2VwID0gIiIpLAogICAgaG92ZXJpbmZvID0gInRleHQiCiAgKSAlPiUKICBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFKQoKc3VicGxvdChjaXR5Q29tcGVuc2F0aW9uMjAyMV8wMSwgY2l0eUNvbXBlbnNhdGlvbjIwMjFfMTUsIGNpdHlDb21wZW5zYXRpb24yMDIxXzUxMCwgY2l0eUNvbXBlbnNhdGlvbjIwMjFfMTBfLCBucm93cyA9IDQpCmBgYAo=